// tabenn1.cpp -- simple base-class methods
//#include "test_240216.h"
//#include <iostream>
//
//TableTennisPlayer::TableTennisPlayer (const string& fn,
//	const string& ln, bool ht) :firstname(fn),
//	lastname(ln), hasTable(ht) {}
//
//void TableTennisPlayer::Name() const
//{
//	std::cout << lastname << ", " << firstname;
//}
//
//// RatedPlayer methods
//RatedPlayer::RatedPlayer(unsigned int r, const string& fn,
//	const string& ln, bool ht) :TableTennisPlayer(fn, ln, ht)
//{
//	rating = r;
//}
//
//RatedPlayer::RatedPlayer(unsigned int r, const TableTennisPlayer& tp)
//	:TableTennisPlayer(tp), rating(r) {}
//
//int main()
//{
//	using std::cout;
//	using std::endl;
//	TableTennisPlayer player1("Tara", "Boomdea", false);
//	RatedPlayer rplayer1(1140, "Mallory", "Duck", true);
//	rplayer1.Name();		// derived object uses base method
//	if (rplayer1.HasTable())
//	{
//		cout << ": has a table.\n";
//	}
//	else
//	{
//		cout << ": hasn't a table.\n";
//	}
//	cout << "Name: ";
//	rplayer1.Name();
//	cout << "; Rating: " << rplayer1.Rating() << endl;
//// initialize RatedPlayer using TableTennisPlayer object
//	RatedPlayer rplayer2(1212, player1);
//	cout << "Name: ";
//	rplayer2.Name();
//	cout << "; Rating: " << rplayer2.Rating() << endl;
//
//	return 0;
//}

// brass.cpp -- bank account class methods
//#include <iostream>
//#include "test_240216.h"
//using std::cout;
//using std::endl;
//using std::string;
//
//// formatting stuff
//typedef std::ios_base::fmtflags format;
//typedef std::streamsize precis;
//format setFormat();
//void restore(format f, precis p);
//
//// Brass methods
//
//Brass::Brass(const string& s, long an, double bal)
//{
//	fullName = s;
//	acctNum = an;
//	balance = bal;
//}
//
//void Brass::Deposit(double amt)
//{
//	if (amt < 0)
//	{
//		cout << "Negative deposit not allowed; "
//			<< "deposit is cancelled.\n";
//	}
//	else
//	{
//		balance += amt;
//	}
//}
//
//void Brass::Withdraw(double amt)
//{
//	// set up ###.## format
//	format initialState = setFormat();
//	precis prec = cout.precision(2);
//
//	if (amt < 0)
//	{
//		cout << "Withdrawal amount must be positive; "
//			<< "withdrawal canceled.\n";
//	}
//	else if (amt <= balance)
//	{
//		balance -= amt;
//	}
//	else
//	{
//		cout << "Withdrawal amount of $" << amt
//			<< " exceeds your balance.\n"
//			<< "Withdrawal canceled.\n";
//	}
//	restore(initialState, prec);
//}
//
//double Brass::Balance() const
//{
//	return balance;
//}
//
//void Brass::ViewAcct() const
//{
//	// set up ###.## format
//	format initialState = setFormat();
//	precis prec = cout.precision(2);
//	cout << "Client: " << fullName << endl;
//	cout << "Account Number: " << acctNum << endl;
//	cout << "Balance: $" << balance << endl;
//	restore(initialState, prec);	// restore orginal format
//}
//
//// BrassPlus Methods
//BrassPlus::BrassPlus(const string& s, long an, double bal,
//					double ml, double r) :Brass(s, an, bal)
//{
//	maxLoan = ml;
//	owesBank = 0.0;
//	rate = r;
//}
//
//BrassPlus::BrassPlus(const Brass& ba, double ml, double r)
//	:Brass(ba)		// use implicit copy constructor
//{
//	maxLoan = ml;
//	owesBank = 0.0;
//	rate = r;
//}
//
//// redefine how ViewAcct() works
//void BrassPlus::ViewAcct() const
//{
//	// set up ###.## format
//	format initialState = setFormat();
//	precis prec = cout.precision(2);
//
//	Brass::ViewAcct();		// display base portion
//	cout << "Maximum loan: $" << maxLoan << endl;
//	cout << "Owed to bank: $" << owesBank << endl;
//	cout.precision(3);		// ###.## format
//	cout << "Loan Rate: " << 100 * rate << "%\n";
//	restore(initialState, prec);
//}
//
//// redefine how Withdraw() works
//void BrassPlus::Withdraw(double amt)
//{
//	// set up ###.## format
//	format initialState = setFormat();
//	precis prec = cout.precision(2);
//
//	double bal = Balance();
//	if (amt <= bal)
//	{
//		Brass::Withdraw(amt);
//	}
//	else if (amt <= bal + maxLoan - owesBank)
//	{
//		double advance = amt - bal;
//		owesBank += advance * (1.0 + rate);
//		cout << "Bank advance: $" << advance << endl;
//		cout << "Finance charge: $" << advance * rate << endl;
//		Deposit(advance);
//		Brass::Withdraw(amt);
//	}
//	else
//	{
//		cout << "Credit limit exceeded. Transaction cancelled.\n";
//	}
//	restore(initialState, prec);
//}
//
//format setFormat()
//{
//	// set up ###.## format
//	return cout.setf(std::ios_base::fixed,
//				std::ios_base::floatfield);
//}
//
//void restore(format f, precis p)
//{
//	cout.setf(f, std::ios_base::floatfield);
//	cout.precision(p);
//}

// usebrass1.cpp -- testing bank account classes
// compile with brass.cpp

//int main()
//{
//	using std::cout;
//	using std::endl;
//
//	Brass Piggy("Porcelot Pigg", 381299, 4000.00);
//	BrassPlus Hoggy("Horatio Hogg", 382288, 3000.00);
//	Piggy.ViewAcct();
//	cout << endl;
//
//	Hoggy.ViewAcct();
//	cout << endl;
//	cout << "Depositing $1000 into the Hogg Account:\n";
//	Hoggy.Deposit(1000.00);
//	cout << "New balance: $" << Hoggy.Balance() << endl;
//	cout << "Withdrawing $4200 from the Pigg Account:\n";
//	Piggy.Withdraw(4200.00);
//	cout << "Pigg account balance: $" << Piggy.Balance() << endl;
//	cout << "Withdrawing $4200 from the Hogg Account:\n";
//	Hoggy.Withdraw(4200.00);
//	Hoggy.ViewAcct();
//
//	return 0;
//}

// usebrass2.cpp -- polymorphic example
// compile with brass.cpp
//const int CLIENTS = 4;
//
//int main()
//{
//	using std::cin;
//	using std::cout;
//	using std::endl;
//
//	Brass* p_clients[CLIENTS];
//	std::string temp;
//	long tempnum;
//	double tempbal;
//	char kind;
//
//	for (int i = 0; i < CLIENTS; i++)
//	{
//		cout << "Enter client's name: ";
//		getline(cin, temp);
//		cout << "Enter client's account number: ";
//		cin >> tempnum;
//		cout << "Enter opening balance: $";
//		cin >> tempbal;
//		cout << "Enter 1 for Brass Account or "
//			<< "2 for BrassPlus Account: ";
//		while (cin >> kind && (kind != '1' && kind != '2'))
//		{
//			cout << "Enter either 1 or 2: ";
//		}
//		if (kind == '1')
//		{
//			p_clients[i] = new Brass(temp, tempnum, tempbal);
//		}
//		else
//		{
//			double tmax, trate;
//			cout << "Enter the overdraft limit: $";
//			cin >> tmax;
//			cout << "Enter the interest rate "
//				<< "as a decimal fraction: ";
//			cin >> trate;
//			p_clients[i] = new BrassPlus(temp, tempnum, tempbal,
//				tmax, trate);
//		}
//		while (cin.get() != '\n')
//		{
//			continue;
//		}
//	}
//	cout << endl;
//	for (int i = 0; i < CLIENTS; i++)
//	{
//		p_clients[i]->ViewAcct();
//		cout << endl;
//	}
//
//	for (int i = 0; i < CLIENTS; i++)
//	{
//		delete p_clients[i];	// free memory
//	}
//	cout << "Done.\n";
//
//	return 0;
//}

// acctabc.cpp -- bank account class methods
//#include <iostream>
//#include "test_240216.h"
//using std::cout;
//using std::ios_base;
//using std::endl;
//using std::string;
//
//// Abstract Base Class
//AcctABC::AcctABC(const string& s, long an, double bal)
//{
//	fullName = s;
//	acctNum = an;
//	balance = bal;
//}
//
//void AcctABC::Deposit(double amt)
//{
//	if (amt < 0)
//	{
//		cout << "Negative deposit not allowed; "
//			<< "deposit is cancelled.\n";
//	}
//	else
//	{
//		balance += amt;
//	}
//}
//
//void AcctABC::Withdraw(double amt)
//{
//	balance -= amt;
//}
//
//// protected methods for formatting
//AcctABC::Formatting AcctABC::SetFormat() const
//{
//	// set up ###.## format
//	Formatting f;
//	f.flag = cout.setf(ios_base::fixed, ios_base::floatfield);
//	f.pr = cout.precision(2);
//	return f;
//}
//
//void AcctABC::Restore(Formatting& f) const
//{
//	cout.setf(f.flag, ios_base::floatfield);
//	cout.precision(f.pr);
//}
//
//// Brass methods
//void Brass::Withdraw(double amt)
//{
//	if (amt < 0)
//	{
//		cout << "Withdrawal amount must be positive; "
//			<< "withdrawal canceled.\n";
//	}
//	else if (amt <= Balance())
//	{
//		AcctABC::Withdraw(amt);
//	}
//	else
//	{
//		cout << "Withdrawal amount of $" << amt
//			<< " exceeds your balance.\n"
//			<< "Withdrawal canceled.\n";
//	}
//}
//
//void Brass::ViewAcct() const
//{
//	Formatting f = SetFormat();
//	cout << "Brass Client: " << FullName() << endl;
//	cout << "Account Number: " << AcctNum() << endl;
//	cout << "Balance: $" << Balance() << endl;
//	Restore(f);
//}
//
//// BrassPlus Methods
//BrassPlus::BrassPlus(const string& s, long an, double bal, double ml, double r) :AcctABC(s, an, bal)
//{
//	maxLoan = ml;
//	owesBank = 0.0;
//	rate = r;
//}
//
//BrassPlus::BrassPlus(const Brass& ba, double ml, double r)
//	:AcctABC(ba)	// use implicit copy constructor
//{
//	maxLoan = ml;
//	owesBank = 0.0;
//	rate = r;
//}
//
//void BrassPlus::ViewAcct() const
//{
//	Formatting f = SetFormat();
//
//	cout << "BrassPlus Client: " << FullName() << endl;
//	cout << "Account Number: " << AcctNum() << endl;
//	cout << "Balance: $" << Balance() << endl;
//	cout << "Maximum loan: $" << maxLoan << endl;
//	cout << "Owed to bank: $" << owesBank << endl;
//	cout.precision(3);
//	cout << "Loan Rate: " << 100 * rate << "%\n";
//	Restore(f);
//}
//
//void BrassPlus::Withdraw(double amt)
//{
//	Formatting f = SetFormat();
//
//	double bal = Balance();
//	if (amt <= bal)
//	{
//		AcctABC::Withdraw(amt);
//	}
//	else if (amt <= bal + maxLoan - owesBank)
//	{
//		double advance = amt - bal;
//		owesBank += advance * (1.0 + rate);
//		cout << "Bank advance: $" << advance << endl;
//		cout << "Finance charge: $" << advance * rate << endl;
//		Deposit(advance);
//		AcctABC::Withdraw(amt);
//	}
//	else
//	{
//		cout << "Credit limit exceeded. Transaction cancelled.\n";
//	}
//
//	Restore(f);
//}
//
// // usebrass3.cpp -- polymorphic example
// // compile with brass.cpp
//const int CLIENTS = 4;
//
//int main()
//{
//	using std::cin;
//	using std::cout;
//	using std::endl;
//
//	AcctABC* p_clients[CLIENTS];
//	std::string temp;
//	long tempnum;
//	double tempbal;
//	char kind;
//
//	for (int i = 0; i < CLIENTS; i++)
//	{
//		cout << "Enter client's name: ";
//		getline(cin, temp);
//		cout << "Enter client's account number: ";
//		cin >> tempnum;
//		cout << "Enter opening balance: $";
//		cin >> tempbal;
//		cout << "Enter 1 for Brass Account or "
//			<< "2 for BrassPlus Account: ";
//		while (cin >> kind && (kind != '1' && kind != '2'))
//		{
//			cout << "Enter either 1 or 2: ";
//		}
//		if (kind == '1')
//		{
//			p_clients[i] = new Brass(temp, tempnum, tempbal);
//		}
//		else
//		{
//			double tmax, trate;
//			cout << "Enter the overdraft limit: $";
//			cin >> tmax;
//			cout << "Enter the interest rate "
//				<< "as a decimal fraction: ";
//			cin >> trate;
//			p_clients[i] = new BrassPlus(temp, tempnum, tempbal,
//				tmax, trate);
//		}
//		while (cin.get() != '\n')
//		{
//			continue;
//		}
//	}
//	cout << endl;
//	for (int i = 0; i < CLIENTS; i++)
//	{
//		p_clients[i]->ViewAcct();
//		cout << endl;
//	}
//
//	for (int i = 0; i < CLIENTS; i++)
//	{
//		delete p_clients[i];	// free memory
//	}
//	cout << "Done.\n";
//
//	return 0;
//}